#include <stdio.h> 
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <unistd.h>

#define KEY 74

int main(int arcg, char *argv[]) {
	int semid;
	struct sembuf *sb;
	int i;
	
	sb = (struct sembuf *) malloc(sizeof(struct sembuf) * 2);
	
	/* Recuperare il semaforo creato dal processo A tramite la semget() */
	semid = semget(KEY, 0, 0666);
	if(semid == -1){
		perror("semget()");
		exit(1);
	}

	for(i=0; i<3; i++) {

		/*Acquisire la risorsa agendo opportunamente sui semafori
		  come fatto per il processo A
		*/	
		
		printf("Process C: sono in attesa di ricevere la risorsa\n");		
		
		/* Mettersi in attesa che il semaforo 1 diventi 0
		   quindi impostare atomicamente il semaforo 1 al valore 1
			 (per rispettare la ciclicita' nell'uso della risorsa) 
			 e proseguire.
		*/
		
		sb[0].sem_num = 2;
		sb[0].sem_op = 0;
		sb[0].sem_flg = 0;
		
		sb[1].sem_num = 2;
		sb[1].sem_op = 1;
		sb[1].sem_flg = 0;
		
		if(semop(semid, sb, 2) == -1){
			perror("P(C)");
			semctl(semid, 0, IPC_RMID, 0);
			exit(1);
		}

		printf("Processo C: ho acquisito la risorsa\n");
		sleep(5);		/* risorsa detenuta 5 secondi */
		if(i == 2){
			printf("Processo C: chiudo il semaforo\n");
			semctl(semid, 0, IPC_RMID, 0);
		}else{
			
			printf("Processo C: sto per rilasciare la risorsa al processo A\n");

			/* rilasciare la risorsa sbloccando il processo A. */
		
			sb[0].sem_num = 0;
			sb[0].sem_op = -1;
			sb[0].sem_flg = 0;
		
			if(semop(semid, sb, 1) == -1){
				perror("V(A)");
				semctl(semid, 0, IPC_RMID, 0);
				exit(1);
			}
		}
		
	}
	return 0;
}
